package main

import (
	"encoding/json"
	"fmt"
)

type Result struct {
	Code int `json:"code"`
	Message string `json:"msg"`
	Data interface{} `json:"data"`
}

type JsonMapType map[string]interface{}

func setData(resMap JsonMapType) {
	resMap["code"] = 200
	resMap["msg"] = "success"
	resMap["data"] = JsonMapType{
		"username": "Tom",
		"age":      "30",
		"hobby":    []string{"读书", "爬山"},
	}
}

func MarshalMapToJson(dataMap JsonMapType) (string, error) {
	jsonData, err := json.Marshal(dataMap)
	if err != nil {
		fmt.Println("json marshal error:", err)
		return "", err
	}
	return string(jsonData), nil
}

func UnmarshalJsonToMap(jsonString string) (JsonMapType, error) {
	var resMap JsonMapType

	err := json.Unmarshal([]byte(jsonString), &resMap)
	if err != nil {
		fmt.Println("json unmarshal error:", err)
		return nil, err
	}

	return resMap, nil
}

func main() {
	// Map 集合是无序的 key-value 数据结构
	var p1 map[int]string = map[int]string{}
	p1[1] = "Tom"
	var p2 map[int]string = make(map[int]string)
	p2[1] = "Tom"
	p3 := map[int]string{}
	p3[1] = "Tom"
	p4 := make(map[int]string)
	p4[1] = "Tom"
	p5 := map[int]string{
		1 : "Tom",
	}
	fmt.Println(p1, p2, p3, p4, p5)

	// 设置JSON
	res := make(map[string]interface{})
	setData(res)

	// 序列化
	jsonStringData, err := MarshalMapToJson(res)
	if err != nil {
		fmt.Println("MarshalMapToJson error:", err)
	} else {
		fmt.Println("MarshalMapToJson success:", jsonStringData)
	}

	//反序列化
	jsonData, err := UnmarshalJsonToMap(jsonStringData)
	if err != nil {
		fmt.Println("UnmarshalJsonToMap error:", err)
	} else {
		fmt.Println("UnmarshalJsonToMap success :", jsonData)
	}
}